package com.power.mock.util;


import com.bj58.spat.wredis.client.wjedis.WJedis;
import redis.clients.jedis.Jedis;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created by yanronggao on 2017/1/12.
 */
public class RedisAdaptor {

    private Object redis;

    public RedisAdaptor(Object redis){
        this.redis = redis;
    }

    public Object getRedis() {
        return redis;
    }

    /**
     *
     * 存储
     *
     * @param key
     *            目标key
     * @param value
     *            value
     * @return
     */
    public String set(final String key, final String value) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).set(key,value);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).set(key, value);
        }
        return null;
    }

    public String setex(String key, int seconds, String value) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).setex(key, seconds, value);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).setex(key, seconds, value);
        }
        return null;
    }

    public Long setnx(String key, String value) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).setnx(key, value);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).setnx(key, value);
        }
        return null;
    }

    public Long expire(String key, int seconds) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).expire(key, seconds);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).expire(key, seconds);
        }
        return null;
    }
    /**
     * 向尾部添加
     *
     * @param key
     * @param strings
     * @return
     */
    public Long rpush(String key, String... strings) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).rpush(key, strings);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).rpush(key, strings);
        }
        return null;
    }

    /**
     * 从尾部出栈
     *
     * @param key
     * @return
     */
    public String rpop(String key) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).rpop(key);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).rpop(key);
        }
        return null;
    }


    public Long incrBy(String key, long integer) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).incrBy(key, integer);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).incrBy(key, integer);
        }
        return null;
    }

    /**
     * 向首部添加
     *
     * @param key
     * @param strings
     * @return
     */
    public Long lpush(String key, String... strings) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).lpush(key, strings);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).lpush(key, strings);
        }
        return null;
    }

    /**
     * 从首部出栈
     *
     * @param key
     * @return
     */
    public String lpop(String key) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).lpop(key);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).lpop(key);
        }
        return null;
    }

    /**
     * 删除队列里的元素
     *
     * @param key
     * @param value
     * @return
     */
    public Long lrem(String key, long count, String value) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).lrem(key, count, value);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).lrem(key, count, value);
        }
        return null;
    }

    /**
     * 长度
     *
     * @param key
     * @return
     */
    public Long llen(String key) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).llen(key);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).llen(key);
        }
        return null;
    }

    /**
     *
     * 取出所有数据
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public List<String> lrange(String key, long start, long end) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).lrange(key, start, end);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).lrange(key, start, end);
        }
        return null;
    }

    public Long hset(String key, String field, String value) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).hset(key, field, value);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).hset(key, field, value);
        }
        return null;
    }

    public String hget(String key, String field) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).hget(key, field);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).hget(key, field);
        }
        return null;
    }

    public Map<String, String> hgetAll(String key) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).hgetAll(key);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).hgetAll(key);
        }
        return null;
    }

    public Long hdel(String key, String... fields) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).hdel(key, fields);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).hdel(key, fields);
        }
        return null;
    }

    public Long del(String key) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).del(key);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).del(key);
        }
        return null;
    }

    /**
     *
     * 从jedis加载数据
     *
     * @param key
     * @return
     */
    public String get(String key) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).get(key);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).get(key);
        }
        return null;
    }

    public Long zadd(String key, double score, String member) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).zadd(key, score, member);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).zadd(key, score, member);
        }
        return null;
    }

    public Long zadd(String key, Map<String, Double> scoreMembers) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).zadd(key, scoreMembers);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).zadd(key, scoreMembers);
        }
        return null;
    }
    /**
     * 有续集降序分页
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Set<String> zrevrange(String key, long start, long end) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).zrevrange(key, start, end);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).zrevrange(key, start, end);
        }
        return null;
    }

    /**
     * 获取key在降序状态下在有续集中的下标，下标从0开始
     * @param key
     * @param member
     * @return
     */
    public Long zrevrank(String key, String member) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).zrevrank(key, member);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).zrevrank(key, member);
        }
        return null;
    }

    public Long zcount(String key, double min, double max) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).zcount(key, min, max);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).zcount(key, min, max);
        }
        return null;
    }

    public Long zcard(String key) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).zcard(key);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).zcard(key);
        }
        return null;
    }

    public Set<String> zrange(String key, long start, long end) {
        if (redis instanceof Jedis) {
            return ((Jedis)redis).zrange(key, start, end);
        } else if (redis instanceof WJedis) {
            return ((WJedis)redis).zrange(key, start, end);
        }
        return null;
    }

    public void close() {
        if (redis instanceof Jedis) {
            ((Jedis)redis).close();
        } else if (redis instanceof WJedis) {
            ((WJedis)redis).close();
        }
    }

    /**
     * 批量get
     * @param keys
     * @return
     */
    public List<String> mget(String[] keys) {
        if (redis instanceof Jedis) {
            return ((Jedis) redis).mget(keys);
        } else if (redis instanceof WJedis) {
            return ((WJedis) redis).mget(keys);
        }
        return null;
    }
}
